//package cn.joeg.web.core.interceptor;
//
//import cn.joeg.app.GCore;
//import cn.joeg.app.css.util.CSS;
//import cn.joeg.app.css.util.dto.CallSession;
//import cn.joeg.web.CSSWidgetConfig;
//import cn.joeg.web.core.vo.WidgetDataReq;
//import com.ecfront.dew.common.JsonHelper;
//import com.ecfront.dew.common.Resp;
//import com.ecfront.dew.common.interceptor.DewInterceptRespBody;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.util.Map;
//
//@Component
//public class WidgetCacheInterceptor extends WidgetDataFetchInterceptor {
//
//    public static final String CACHE_DATA_CONTEXT = "cacheData";
//    public static final String CACHE_ABLE_CONTEXT = "__cacheAble";
//    public static final String CACHE_ARGS_CONTEXT = "__cacheArgs";
//    public static final String REDIS_CACHE_KEY = "samantha:css:app:cache:";
//
//    @Autowired
//    private CSSWidgetConfig cssWidgetConfig;
//
//    @Override
//    public Resp<DewInterceptRespBody<WidgetDataReq>> before(WidgetDataReq obj, Map<String, Object> context) {
//        WidgetDef widgetDef = (WidgetDef) context.get(WidgetDefInterceptor.WIDGET_DEF_CONTEXT);
//        if (widgetDef == null) {
//            return Resp.notFound(String.format("Code[%s]不存在", obj.getWidgetCode()));
//        }
//        if (!widgetDef.isCacheAble()) {
//            return Resp.success(DewInterceptRespBody.build(obj, context));
//        }
//        // 需要处理缓存
//        CallSession callSessionDTO = CSS.Call.getCallSession();
//        context.put(CACHE_ABLE_CONTEXT, true);
//        String[] cacheAttchArgs = widgetDef.getCacheArgs() != null ? widgetDef.getCacheArgs().split(WidgetDef.CACHE_ARGS_SPLIT) : new String[]{};
//        StringBuilder sb = new StringBuilder(widgetDef.getCode() + WidgetDef.CACHE_ARGS_SPLIT);
//        for (String arg : cacheAttchArgs) {
//            sb.append(obj.getArgs().path(arg).asText("")).append(WidgetDef.CACHE_ARGS_SPLIT);
//        }
//        context.put(CACHE_ARGS_CONTEXT, sb.toString().hashCode() + "");
//        String cachedStr = Dew.cluster.cache.hget(REDIS_CACHE_KEY + callSessionDTO.getBusinessCode(), sb.toString().hashCode() + "");
//        if (cachedStr != null) {
//            context.put(CACHE_DATA_CONTEXT, cachedStr);
//        }
//        return Resp.success(DewInterceptRespBody.build(obj, context));
//    }
//
//    @Override
//    public Resp<DewInterceptRespBody<WidgetDataReq>> after(WidgetDataReq obj, Map<String, Object> context) {
//        if ((boolean) context.getOrDefault(CACHE_ABLE_CONTEXT, false)) {
//            Resp resp = JsonHelper.toObject(context.get(CACHE_ARGS_CONTEXT), Resp.class);
//            if (resp.ok()) {
//                CallSession callSessionDTO = CSS.Call.getCallSession();
//                GCore.cluster.cache.hset(REDIS_CACHE_KEY + callSessionDTO.getBusinessCode(), JsonHelper.toJsonString(resp.getBody()), JsonHelper.toJsonString(obj.getWidgetDataResp()));
//                GCore.cluster.cache.expire(REDIS_CACHE_KEY + callSessionDTO.getBusinessCode(), cssWidgetConfig.getCacheTimeoutMinutes() * 60);
//            }
//        }
//        return Resp.success(DewInterceptRespBody.build(obj, context));
//    }
//
//}
